var async=require('async');
var h=require('./helper');

/**
 * auto用来处理有依赖关系的多个任务的执行。
 *
 * 比如某些任务之间彼此独立，可以并行执行；但某些任务依赖于其它某些任务，只能等那些任务完成后才能执行。
 * 虽然我们可以使用parallel和series结合起来实现该功能，但如果任务之间关系复杂，则代码会相当复杂，以后如果想添加一个新任务，也会很麻烦。
 * 这时使用auto，则会事半功倍。
 *
 * 如果有任务中途出错，则会把该错误传给最终callback，所有任务（包括已经执行完的）产生的数据将被忽略。
 * 如果不关心错误和最终数据，可以不用写最后那个callback。
 */
// async.auto(tasks, [callback])

/**
 * 我要写一个程序，它要完成以下几件事：
 * 1. 从某处取得数据
 * 2. 在硬盘上建立一个新的目录
 * 3. 将数据写入到目录下某文件
 * 4. 发送邮件，将文件以附件形式发送给其它人。
 *
 * 分析该任务，可以知道1与2可以并行执行，3需要等1和2完成，4要等3完成。
 * 可以按以下方式来使用auto函数。
 */
// 1.1
async.auto({
    getData: function (callback,retsult) {
        setTimeout(function(){
            console.log('\n\getData>ret:',retsult);
            callback(null, '并行Task1');
        }, 300);
    },
    makeFolder: function (callback,retsult) {
        setTimeout(function(){
            console.log('\n\makeFolder>ret:',retsult);
            callback(null, '并行Task2');
        }, 200);
    },
    writeFile: ['getData', 'makeFolder', function(callback,retsult) {
        setTimeout(function(){
            console.log('\n\nwriteFile>ret:',retsult);
            callback(null, 'writeFile ret');
        }, 300);
    }],
    emailFiles: ['writeFile', function(callback, retsult) {
        console.log('\n\nemailed file>ret: ', retsult);
        callback(null, 'emailFiles ret');
    }]
}, function(err, retsult) {
    if(err)throw err;
    console.log('\n\n总ret: ', retsult);
});

//回调函数retsult参数
/*
1.每一个回调函数（包括最后处理错误和总结果的函数）的第2个参数(retsult)都指向同一个对象
2.这个对象初始为空对象
3.有函数执行完成，并调用了cb(null,'需要传入结果的数据')时，在这个对象上添加以函数对应键名为此结果键名
*/